home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Aminet 30
/
Aminet 30 (1999)(Schatztruhe)[!][Apr 1999].iso
/
Aminet
/
util
/
boot
/
mclk32.lha
/
Source
/
mclk32.s
Wrap
Text File
|
1999-01-07
|
7KB
|
243 lines
;fixed Values are: a5 -> IntuitionBase
; a4 -> DosBase
; d4 -> window UserPort
; d5 -> ExecBase
; d6 -> window handle
; d7 -> last seconds
ExecBase = 4
OpenLib = -552
CloseLib = -414
OpenWorkBench = -210
OpenWindow = -204
CloseWindow = -72
GetMsg = -372
AvailMem = -216
SetWindowTitles = -276
Delay = -198
DateStamp = -192
FindTask = -294
SetTaskPri = -300
;Test68020+
movea.l ExecBase,a6 ;ExecBase nach a6
move.l a6,d5 ;ExecBase nach d5
btst #1,$128+1(a6) ;128 = AttnFlags (+1, da Byte-Zugriff)
bne.b run ;Ist CPU >= 68020 vorhanden?
moveq #20,d0 ;Fehlercode 20 setzen
rts ;und beenden
run
movea.l #0,a1
jsr FindTask(a6) ;Task-Pointer holen
movea.l d0,a1
moveq #-5,d0
jsr SetTaskPri(a6) ;Task-Priorität setzen
clr.l d0 ;Version egal
lea IntName,a1 ;Name der Intuition-Bibliothek
jsr OpenLib(a6) ;Intuition öffnen
movea.l d0,a5 ;IntuitionBase retten
clr.l d0 ;Version egal
lea DosName,a1 ;Name der Intuition-Bibliothek
jsr OpenLib(a6) ;dos.library öffnen
movea.l d0,a4 ;DosBase retten
WorkbenchOpen
movea.l a5,a6 ;IntuitionBase nach a6
jsr OpenWorkBench(a6) ;Hole WorkBenchScreen-Handle
tst.l d0
beq CloseDos ;wenn Workbench Screen nicht gefunden
movea.l d0,a1
move.w $0c(a1),d2 ;Screen-Breite nach d2
subi.w #375,d2 ;Fenster-X-Position ausrechnen
move.w d2,window_defs ;Fenster-X-Position setzen
windopen
lea window_defs,a0 ;Zeiger auf Fenster-Definition
jsr OpenWindow(a6) ;Fenster öffnen
move.l d0,d6 ;Fenster-Handle retten
SetScreenTitle
movea.l d0,a0 ;Fenster-Handle nach a0
move.l 86(a0),d4 ;User-Port-Zeiger nach d4 für späteren Gebrauch
movea.l #-1,a1 ;Window-Titel beibehalten
lea ScreenTitle,a2
jsr SetWindowTitles(a6)
moveq #-1,d7 ;Sekunden auf ungültig setzen
GetCurrentTime
movea.l a4,a6 ;DosBase nach a6
move.l #Time,d1 ;Zeiger auf DateStamp nach d1
jsr DateStamp(a6) ;aktuelle Zeit holen
Ticks
move.l Time+8,d1 ;Ticks holen
divu.w #50,d1 ;Ticks in Sekunden umrechnen
cmp.b d7,d1 ;Ist bereits eine Sekunde vergangen?
beq Wait ;wenn nicht, dann warte noch
move.b d1,d7 ;Sekunden merken
swap d1
clr.w d1 ;Divisions-Rest löschen
swap d1
lea Uhr+6,a0
divu.w #10,d1 ;Zehnerstelle berechnen
jsr .ziffer
add.w #$30,d1 ;in ASCII umwandeln
move.b d1,(a0)+ ;schreiben
.Minutes
move.l Time+4,d1 ;Minuten holen
lea Uhr,a0
divu.w #600,d1 ;Zehnerstelle der Stunden berechnen
jsr .ziffer
divu.w #60,d1 ;Einerstelle der Stunden berechnen
jsr .ziffer
addq #1,a0 ;Doppelpunkt überspringen
divu.w #10,d1 ;Zehnerstelle der Minuten holen
jsr .ziffer
pea AvailChipMem(pc) ;schneller als 'jsr .ziffer' + 'jmp AvailChipMem'
.ziffer
add.w #$30,d1 ;in ASCII umwandeln
move.b d1,(a0)+ ;schreiben
clr.w d1 ;unteres Wort löschen
swap d1 ;Rest nach unten holen
rts
AvailChipMem
movea.l d5,a6 ;ExecBase nach a6
moveq.l #2,d1 ;Chip-Ram
lea ChipValue,a2 ;Ausgabe-Speicher
moveq #4-1,d3 ;Anzahl der Stellen -1
lea Pot4,a3
jsr GetAvailMem
AvailFastMem
moveq.l #4,d1 ;Fast-Ram
lea FastValue,a2 ;Ausgabe-Speicher
moveq #6-1,d3 ;Anzahl der Stellen -1
lea Pot6,a3
jsr GetAvailMem
SetWindowTitle
movea.l a5,a6 ;IntuitionBase nach a6
movea.l d6,a0 ;Fenster-Handle nach a0
lea windowname,a1
movea.l #-1,a2 ;Screen-Titel beibehalten
jsr SetWindowTitles(a6)
Wait
movea.l a4,a6 ;DosBase nach a6
moveq.l #10,d1
jsr Delay(a6)
GetMessage
movea.l d4,a0 ;User-Port-Zeiger nach a0
movea.l d5,a6 ;ExecBase nach a6
jsr GetMsg(a6) ;Message holen
tst.l d0 ;Prüfen auf Ereignis
beq GetCurrentTime
windclose
movea.l a5,a6 ;IntuitionBase nach a6
movea.l d6,a0 ;Fenster-Handle nach a0
jsr CloseWindow(a6) ;Fenster schließen
CloseDos
movea.l d5,a6
movea.l a4,a1 ;DosBase nach a1
jsr CloseLib(a6)
CloseInt
movea.l a5,a1 ;IntBase nach a1
jsr CloseLib(a6)
rts
;---------------------------------------------
GetAvailMem
jsr AvailMem(a6)
moveq.l #10,d1 ;für Division durch 1024 (->lsr.l #10,d0)
lsr.l d1,d0 ;Division durch 1024 - jetzt KByte
bin_dez ;Unterprogramm zur Umwandlung von Binärzahlen in Dezimalzahlen
;a2 = Zeiger auf Ausgabespeicher
;a3 = Zeiger auf Potenzen
;d0 = Umzuwandelnde Zahl
;d3 = Anzahl der Stellen -1
;d2 = wenn null, dann Leerzeichen statt Null ausgeben
clr.b d2
.next
moveq #'0'-1,d1
.loop
addq.b #1,d1
sub.l (a3),d0
bcc .loop ;ist die Zahl durch Potenz teilbar ?
add.l (a3)+,d0
cmpi.b #'0',d1 ;prüfen auf '0'
bne .skip1
tst.b d2
bne .skip2
moveq #' ',d1
jmp .skip2
.skip1
moveq #1,d2
.skip2
move.b d1,(a2)+ ;Ziffer ausgeben
dbf d3,.next ;werden weitere Stellen benötigt ?
rts
;---------------------------------------------
IntName
dc.b 'intuition.library',0
even
DosName
dc.b 'dos.library',0
even
Pot6 dc.l 100000
dc.l 10000
Pot4 dc.l 1000
dc.l 100
Pot2 dc.l 10
dc.l 1
window_defs
dc.w 10 ;X-Position
dc.w 0 ;Y-Position
dc.w 353 ;Breite
dc.w 10 ;Höhe
dc.b 1 ;Schriftfarbe
dc.b 3 ;Hintergrundfarbe
dc.l $200 ;IDCMP-Flags
dc.l $e ;Flags
dc.l 0 ;Zeiger auf Gadget-Liste
dc.l 0 ;Zeiger auf Checkmark-Image
dc.l windowname ;Zeiger auf Fenster-Titel
dc.l 0 ;Zeiger auf Screen-Handle
dc.l 0 ;Zeiger auf Bitmap
dc.w 0 ;Mindestbreite
dc.w 0 ;Mindesthöhe
dc.w 0 ;maximale Breite
dc.w 0 ;maximale Höhe
dc.w 1 ;Screen-Typ
windowname
dc.b 'Chip:'
ChipValue
dc.b 'xxxx Fast:'
FastValue
dc.b 'xxxxxx Time:'
Uhr
dc.b 'xx:xx:xx',0
dc.b '$VER:'
ScreenTitle
dc.b 'mclk32 1.1 (7.1.99)',0
even
Time
dc.l 0,0,0 ;Days,Minutes,Ticks